package com.tedu.day02.oop;

/**
 * 抽象类特点（补充）
 *            类：成员变量/成员方法/构造方法
 *         抽象类：成员变量/成员方法/构造方法
 *         创建抽象类----普通类变成（实现）子类----继承抽象类
 *         成员变量：既可以是变量也可以是常量
 *         构造方法：有.用于子类访问调用抽象【父】类的成员变量----赋值
 *         构造方法：既可以抽象，非抽象
 *         抽象方法与非抽象方法出现在抽象类当中问题；
 *         A：抽象方法  【重写】强制要求子类去完成父类抽象方法
 *         B：非抽象方法 【拓展】子类继承的事情，提高代码复用性
 */

 abstract   class  Foo{
    //成员变量
    public int i=10;
    public final int J=20;   //成员变量：常量
    //Java强类型语言：大小写分明
    //public int j=30;
    //构造方法:无参
    public Foo() {
        this(30);//调取当前类的其他构造器
    }

    public Foo(int i) {
        this.i = i;
    }
    //成员方法:抽象方法
    public abstract void show();
    //成员方法:非抽象方法
    public void method(){
        System.out.println("Foo  method");
    }
}

//实现【子】类
class Goo extends Foo{
     public void show() {
         System.out.println("Goo  show");
    }
    public void method(){
        System.out.println("Goo method");
    }
}

public class 抽象类补充知识点 {
    public static void main(String[] args) {
        //抽象类----继承---多态性---向上造型
        Foo f=new Goo();
        //①实例化----走子类构造器.默认存在无参构造器.
        // 在通过super（）调用父类构造器
        //②执行抽象类无参构造器.发现有this（参数）调用本类其他有参数构造器
        //③this调用的同时.完成对抽象类中 i 进行赋值 i=30
        System.out.println(f.i);//30
        //f.J=40; 不能修改
        System.out.println(f.J);

        //-------------------------------------------------
        f.show();         //输出：Goo show      重写
        f.method();       //输出：Foo method    拓展【子类方法重写】
    }
}
/*拓展：abstract 关键字共存问题*/
abstract class Aoo{
     // private  abstract void show1();       冲突
    //  public final abstract void  show2()   冲突
   //   public static abstract void show3();  无意义：二选一   静态方法需要加语法块{} 抽象方法
}
